home *** CD-ROM | disk | FTP | other *** search
- {
- KAI ROHRBACHER
-
- As promised, here is some TP-code to check whether your machine
- supports the extended timing services of the AT's-BIOS: if all works
- fine, the Program should give two beeps, the 2nd exactly 5secs after
- the 1st one -and then terminate.
-
- (To all others reading this: this timing scheme normally works
- _asynchrone_ to whatever you are doing in the "foreground" Program and
- thus is great For timing events. What's more: the clock has a
- resolution of some microseconds!)
- }
-
- Const
- WaitTime = 5000;
- Var
- IsAT,
- TimeFlag : Byte;
- CycleTime : LongInt;
-
- Function AT : Boolean;
- { in: - }
- {out: True/False, if the machine is (at least) an AT}
- begin
- AT := MEM[$F000 : $FFFE] = $FC;
- end;
-
- Procedure SetWaitingTime(milliseconds : Word);
- { in: milliseconds = time to wait in ms}
- {out: CycleTime := that same value in microseconds}
- { TimeFlag := $80}
- {rem: won't work With PC's}
- begin
- TimeFlag := $80;
- CycleTime := LongInt(milliseconds) * LongInt(1000);
- if (milliseconds <> 0) and AT then
- IsAT := 0 {yes, use timing mechanism}
- else
- IsAT := $80; {no, don't use that extended service}
- end;
-
- Procedure Wait;
- begin
- Asm
- MOV AL, IsAT
- or AL, AL
- JNE @L11
- MOV TimeFlag,AL
- MOV DX, Word PTR CycleTime
- MOV CX, Word PTR CycleTime+2
- MOV BX, OFFSET TimeFlag
- MOV AX, DS
- MOV ES, AX
- MOV AX, 8300h
- INT 15h
- @L11:
-
- @L10:
- MOV AL, TimeFlag {look at bit 7: 1/0 = time over/not over}
- and AL, $80
- JE @L10
- end;
- end;
-
- begin
- if not AT then
- begin
- WriteLN('Sorry, this Program requires the extended BIOS-' +
- 'services, available on AT''s only!');
- Halt(1);
- end;
- WriteLN('The time between the two beeps should be exactly ', WaitTime,
- ' milliseconds!');
- Write(#7);
- SetWaitingTime(5000);
- Wait;
- Write(#7);
- end.